import { baseUrl, tokenKey } from '@/common/config.js'
import { useUserStore } from '@/stores'

export const Request = (vm)=>{
    // 初始化请求配置
    uni.$uv.http.setConfig((config) => {
        /* config 为默认全局配置*/
		config.baseURL = baseUrl; /* 根域名 */
		config.timeout = 10000;
		config.sslVerify = false;
        return config
    })
	
	// 请求拦截
	uni.$uv.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		console.log('请求拦截', config);
		if(config.url.startsWith('http')) {
			// 兼容http://开头的url
			// 获取协议+域名, 路径
			const [protocol, path] = config.url.split('://');
			const domain = path.split('/')[0]
			const url =  path.replace(domain,'')
            config.url = url
            config.baseURL = `${protocol}://${domain}`
            
            console.log(config);
		}
		const userStore = useUserStore()
	 //    // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
	 //    config.data = config.data || {}
		// // 根据custom参数中配置的是否需要token，添加对应的请求头
		config.header = {
			...config.header,
			// [tokenKey]: token
		};
		
		// if(config?.custom?.auth) {
		// 	// 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
		// 	config.header.token = vm.$store.state.userInfo.token
		// }
		
		console.log('请求: ' + config.url+ "=>", config)
	    return config 
	}, config => { // 可使用async await 做异步操作
		console.log('请求失败', config);
	    return Promise.reject(config)
	})
	
	// 响应拦截
	uni.$uv.http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		console.log('响应: ' + response.config.url.replace(response.config.baseURL, "") + "=>", response)
		// 自定义参数
		const custom = response.config?.custom
		if (data.code !== 200) { 
			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			if (custom.toast !== false) {
				uni.$uv.toast(data.message)
			}

			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise，请求不会进入catch中
				return new Promise(() => { })
			}
		}
		return data.data === undefined ? {} : data.data
	}, (response) => { 
		// 对响应错误做点什么 （statusCode !== 200）
		console.log('响应: ' + response.config.url.replace(response.config.baseURL, "") + "=>", response)
		return Promise.reject(response)
	})
}